{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用[0， 1]上的均匀分布来生成任意连续分布\n",
    "\n",
    "#### 算法原理\n",
    "\n",
    "定理：若随机变量X的分布函数$F_{X}(x)$为严格单调增的连续函数，其反函数$F_{X}^{-1}(y)$存在，则$Y = F_{X}(x)$服从$(0, 1)$上的均匀分布$U(0, 1)$.(证明略)\n",
    "\n",
    "这个定理表明：均匀分布在连续分布类中占有特殊地位。任一个连续随机变量$X$都可以通过其分布函数$F_{X}(x)$于均匀分布随机变量$U$发生关系。譬如$X$服从指数分布$Exp(\\lambda)$, 其分布函数为$F_{x} = 1 - e^{-\\lambda x}$,当$x$换为$X$后，有\n",
    "$$U = 1 - e^{-\\lambda X}$$ 或$$X = \\frac{1}{\\lambda}ln\\frac{1}{1-U}$$ 而后一式表明：由均匀分布$U(0, 1)$的随机数（伪观察值）$u_{i}$可得指数分布$Exp(\\lambda)$的随机数$x_{i} = \\frac{1}{\\lambda}ln\\frac{1}{1-u_{i}}, i = 1, 2, 3...$.\n",
    "\n",
    "\n",
    "#### Python实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "from scipy.special import erfinv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义基类\n",
    "class MyRandom:\n",
    "    def __init__(self, n=500):\n",
    "        self._n = n\n",
    "        self._uniform_points = np.random.uniform(0, 1, n)\n",
    "        self._comput_points = None\n",
    "        self._mydist_points = None\n",
    "\n",
    "    def get_comput_points(self):\n",
    "        pass\n",
    "\n",
    "    def get_mydist_point(self):\n",
    "        pass\n",
    "\n",
    "    def plot(self):\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 指数分布验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2beac05be0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Exponential\n",
    "class MyExp(MyRandom):\n",
    "    def __init__(self, lamb=1, n=500):\n",
    "        super().__init__(n)\n",
    "        self._lamb = lamb\n",
    "\n",
    "    def get_comput_points(self):\n",
    "        self._comput_points = np.random.exponential(self._lamb, self._n)\n",
    "\n",
    "    def get_mydist_point(self):\n",
    "        self._mydist_points = (1/self._lamb)*np.log(1/(1-self._uniform_points))\n",
    "\n",
    "    def plot(self):\n",
    "        self.get_comput_points()\n",
    "        self.get_mydist_point()\n",
    "\n",
    "        plt.subplot(211)\n",
    "        sns.distplot(self._comput_points)\n",
    "        plt.subplot(212)\n",
    "        sns.distplot(self._mydist_points)\n",
    "        plt.suptitle('X~Exp(%s)' % self._lamb)\n",
    "        plt.show()\n",
    "\n",
    "myexp = MyExp(2, 500)\n",
    "myexp.plot()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上面的子图是计算机生成的指数分布，下面的是通过上面的算法生成的，可以看到基本是一致的。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 正态分布验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2be70282e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Normal\n",
    "class MyNormal(MyRandom):\n",
    "    def __init__(self, mu=0, sigma=1, n=500):\n",
    "        super().__init__(n)\n",
    "        self._mu = mu\n",
    "        self._sigma = sigma\n",
    "\n",
    "    def get_comput_points(self):\n",
    "        self._comput_points = np.random.normal(self._mu, self._sigma, self._n)\n",
    "\n",
    "    def get_mydist_point(self):\n",
    "        self._mydist_points = erfinv(2*self._uniform_points-1)*(self._sigma/np.sqrt(2))+self._mu\n",
    "\n",
    "    def plot(self):\n",
    "        self.get_comput_points()\n",
    "        self.get_mydist_point()\n",
    "\n",
    "        plt.subplot(211)\n",
    "        sns.distplot(self._comput_points)\n",
    "        plt.subplot(212)\n",
    "        sns.distplot(self._mydist_points)\n",
    "        plt.suptitle('X~N(%s, %s)' % (self._mu, self._sigma))\n",
    "        plt.show()\n",
    "\n",
    "mynorm = MyNormal(0, 1, 500)\n",
    "mynorm.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "同样，上面的子图是计算机生成的正态分布，下面的是通过上面的算法生成的，也基本是一致的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
